package cn.lg.soar.common.data.msg;

import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;

/**
 * 国际化
 * @author luguoxiang
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public interface I18n {

    Map<String, String> CACHE = new HashMap<>();

    /**
     * 获取消息
     * @param args 消息参数
     * @return
     */
    String msg(Object ...args);

    /**
     * 获取消息代码
     * @return
     */
    String code();

    /**
     * 构造消息
     * @param code 消息代码
     * @return
     */
    static I18n build(String code) {
        String template = CACHE.get(code);
        Impl impl = new Impl();
        impl.code = code;
        impl.template = template == null ? code : template;
        return impl;
    }

    /**
     * 构造消息
     * @param code 消息代码
     * @param template 消息模板
     * @return
     */
    static I18n build(String code, String template) {
        Impl impl = new Impl();
        impl.code = code;
        impl.template = template;
        return impl;
    }

    /**
     * 缓存消息模板
     * @param code 消息代码
     * @param template 消息模板
     */
    static void put(String code, String template) {
        CACHE.put(code, template);
    }

    /**
     * 缓存多个消息模板
     * @param map
     */
    static void put(Map map) {
        CACHE.putAll(map);
    }

    class Util {

        public static String codeFormat(String...keys) {
            return String.join(".", keys).toLowerCase();
        }

        public static String codeFormat(Enum<? extends Enum> e) {
            return codeFormat(e.getClass().getSimpleName(), e.name());
        }
    }

    class Impl implements I18n {

        private String code;

        private String template;

        @Override
        public String msg(Object... args) {
            if (args != null && args.length != 0) {
                return MessageFormat.format(template, args);
            }
            return template;
        }

        @Override
        public String code() {
            return code;
        }
    }

}
